package zw_601_700.zw_628_三个数的最大乘积;

import java.util.Arrays;

class Solution {

    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 4};
        int product = maximumProduct(nums);
        System.out.println(product);
    }

    /**
     * 直接求数组最大的三个数和最小的两个数，判断乘积大小
     *
     * @param nums
     * @return
     */
    public static int maximumProduct(int[] nums) {
        // 最小的和第二小的
        int min1 = Integer.MAX_VALUE, min2 = Integer.MAX_VALUE;
        // 最大的、第二大的和第三大的
        int max1 = Integer.MIN_VALUE, max2 = Integer.MIN_VALUE, max3 = Integer.MIN_VALUE;
        for (int x : nums) {
            if (x < min1) {
                min2 = min1;
                min1 = x;
            } else if (x < min2) {
                min2 = x;
            }
            if (x > max1) {
                max3 = max2;
                max2 = max1;
                max1 = x;
            } else if (x > max2) {
                max3 = max2;
                max2 = x;
            } else if (x > max3) {
                max3 = x;
            }
        }
        return Math.max(min1 * min2 * max1, max1 * max2 * max3);
    }


    /**
     * 方法一：排序
     * 首先将数组排序。
     * 如果数组中全是非负数，则排序后最大的三个数相乘即为最大乘积；如果全是非正数，则最大的三个数相乘同样也为最大乘积。
     * 如果数组中有正数有负数，则最大乘积既可能是三个最大正数的乘积，也可能是两个最小负数（即绝对值最大）与最大正数的乘积。
     * 综上，我们在给数组排序后，分别求出三个最大正数的乘积，以及两个最小负数与最大正数的乘积，二者之间的最大值即为所求答案。
     *
     * @param nums
     * @return
     */
//    public static int maximumProduct(int[] nums) {
//        Arrays.sort(nums);
//        int n = nums.length;
//        return Math.max(nums[0] * nums[1] * nums[n - 1], nums[n - 3] * nums[n - 2] * nums[n - 1]);
//    }

}